import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: ws
 * Date: 2023-12-22
 * Time: 23:13
 */

// ================集合类不安全实例===================


public class Main {
    public static void main(String[] args) {

        // 一 ArrayList
        // 1
//        List<String> list1 = new ArrayList<>();
//        for (int i = 0; i < 3; i++) {
//            new Thread(() -> {
//                list1.add(UUID.randomUUID().toString().substring(0, 8));
//                System.out.println(list1);
//            }).start();
//        }

        // ArrList 非线程安全的集合
        List<String> list1 = new ArrayList<>();
        for (int i = 0; i < 30; i++) {
            new Thread(() -> {
                list1.add(UUID.randomUUID().toString().substring(0, 8));
                System.out.println(list1);
            }).start();
        }



        /**
         * 故障
         * java.util.ConcurrentModificationException
         *
         * 导致原因
         * 并发争抢修改导致
         *
         * 解决方法
         * 1. 线程安全的List new Vector<>()
         * 每个方法加 synchronized
         * 2. 集合工具类的线程安全的方法 Collections.synchronizedList(new ArrayList<>())
         *      类似的set，map也在里面
         * 3. juc 下面的 CopyOnWriteArrayList<>()，使用 ReentrantLock 加锁解锁，每次扩容一个位置
         *    public boolean add(E e) {
         *         final ReentrantLock lock = this.lock;
         *         lock.lock();
         *         try {
         *             Object[] elements = getArray();
         *             int len = elements.length;
         *             Object[] newElements = Arrays.copyOf(elements, len + 1);
         *             newElements[len] = e;
         *             setArray(newElements);
         *             return true;
         *         } finally {
         *             lock.unlock();
         *         }
         *     }
         *
         * 优化建议
         *
         *
         */


        // 二 Set
//        Set<String> set = new HashSet<>();
//        for (int i = 0; i < 30; i++) {
//            new Thread(() -> {
//                set.add(UUID.randomUUID().toString().substring(0, 8));
//                System.out.println(set);
//            }).start();
//        }


        /**
         * 同理
         * 1. Collections.synchronizedSet();
         * 2. CopyOnWriteArraySet<>();//底层还是 CopyOnWriteArrayList<>()
         *         public CopyOnWriteArraySet() {
         *             al = new CopyOnWriteArrayList<E>();
         *         }
         */

        // 三
//        Map<String, String> map = new HashMap<>();
//        for (int i = 0; i < 30; i++) {
//            new Thread(() -> {
//                map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0, 8));
//                System.out.println(map);
//            }).start();
//        }



        /**
         *    1.    ConcurrentHashMap<>()
         *    2.    Collections.synchronizedMap();
         */
    }
}
